package com.sanbi.erp.api.web;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.fastjson.JSONObject;
import com.sanbi.common.util.JacksonUtil;
import com.sanbi.common.vo.PageListVo;
import com.sanbi.common.vo.ResponseVo;
import com.sanbi.erp.core.system.ErrorEnum;
import com.sanbi.erp.core.util.DownLoadFileUtils;
import com.sanbi.erp.core.util.OkHttpUtil;
import com.sanbi.erp.core.util.ResponseUtils;
import com.sanbi.erp.core.vo.PNGUploadRespVo;
import com.sanbi.erp.db.config.BizException;
import com.sanbi.erp.db.domain.Product;
import com.sanbi.erp.db.domain.ProductEasyExcelAdd;
import com.sanbi.erp.db.domain.ProductEasyExcelGroupAdd;
import com.sanbi.erp.db.domain.ProductEasyExcelUpdate;
import com.sanbi.erp.db.service.ProductService;
import com.sanbi.erp.db.util.CheckoutUtil;
import com.sanbi.erp.db.util.easyExcel.EasyExcelListener;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @introduce: 商品服务
 * @Date: 2022/10/18 14:35
 * @Author: XYP
 */
@Slf4j
@Validated
@RestController
@RequestMapping("/erp/product")
public class ErpProductController {
    @Resource
    ProductService productService;

    // png本地图片保存路径
    @Value("${easyExcel.qrcodeLocalPathPng}")
    private String qrcodeLocalPathPng;
    // pdf文件存本地储地址
    @Value("${easyExcel.qrcodeLocalPathPdf}")
    private String qrcodeLocalPathPdf;
    // excel文件存本地储地址
    @Value("${easyExcel.qrcodeLocalPathXlsl}")
    private String qrcodeLocalPathXlsl;
    // 文件服务器地址
    @Value("${easyExcel.defaultFileServer}")
    private String defaultFileServer;
    // pdf文件上传
    @Value("${easyExcel.fileServer}")
    private String fileServer;

    /**
     * 单个货品新增
     * @param product
     * @return
     */
    @PostMapping("/saveOne")
    public ResponseVo<Integer> saveOne(@RequestBody Product product){
        if (product == null) {
            throw new BizException(ErrorEnum.ErrorCode.BadReqArgument);
        }
        return ResponseVo.ok(this.productService.insertSelectiveAdd(product));
    }

    /**
     * 单个商品编辑
     * @param product
     * @return
     */
    @PostMapping("/updateOne")
    public ResponseVo<Integer> updateOne(@RequestBody Product product){
        if (product == null || CheckoutUtil.isEmptyInteger(product.getId())) {
            throw new BizException(ErrorEnum.ErrorCode.BadReqArgument);
        }
        return ResponseVo.ok(this.productService.updateOne(product));
    }

    /**
     * 获取单个商品信息
     * @param id 商品id
     * @return
     */
    @GetMapping("/getOne")
    public ResponseVo<Product> getOne(@RequestParam Integer id){
        if (CheckoutUtil.isEmptyInteger(id)) {
            throw new BizException(ErrorEnum.ErrorCode.BadReqArgument);
        }
        return ResponseVo.ok(this.productService.selectOne(id));
    }

    /**
     * 获取商品信息（单商品）
     * @param body 查询条件
     * {detailsType 0 默认 1 库存sku 2 店铺sku 3 中文名称 4 英文名称 5 供应商,
     *  matching  0 默认 1 精确匹配 2 模糊匹配,
     *  message 查询内容,
     *  skuState sku状态 0 全部 1 正常销售，2 停止销售，3 清仓,
     *  categoryId 类目id 0 全部
     *  page 页索引
     *  limit 页大小}
     * @return
     */
    @PostMapping("/getList")
    public ResponseVo<PageListVo<Product>> getList(@RequestBody String body) {
        Integer page = JacksonUtil.parseInteger(body, "page");
        Integer limit = JacksonUtil.parseInteger(body, "limit");
        if (!ObjectUtils.allNotNull(page, limit)) {
            throw new BizException(ErrorEnum.ErrorCode.BadReqArgument);
        }
        return ResponseVo.okList(this.productService.selectLinkList(body,page,limit));
    }

    /**
     * 获取商品信息（单商品）
     * @param body 查询条件
     * {1 商品sku 2 店铺sku 3 中文名称 4 英文名称 5 供应商
     *  page 页索引
     *  limit 页大小}
     * @return
     */
    @PostMapping("/getListDoubleClick")
    public ResponseVo<PageListVo<Product>> getListDoubleClick(@RequestBody String body,@RequestBody List<String> listSku) {
        Integer page = JacksonUtil.parseInteger(body, "page");
        Integer limit = JacksonUtil.parseInteger(body, "limit");
        if (!ObjectUtils.allNotNull(page, limit)) {
            throw new BizException(ErrorEnum.ErrorCode.BadReqArgument);
        }
        return ResponseVo.okList(this.productService.getListDoubleClick(body,page,limit,listSku));
    }

    /**
     * 批量添加商品（单商品）
     * 从Excel表格读取数据
     * @param filePath 阿里云文件存储地址
     * @return
     */
    @GetMapping("/addProductExcel")
    public ResponseVo<String> addProductExcel(@RequestParam String filePath) {
        // String filePath = "http://192.168.1.118:9091/group1/2022/11/02/20221102124501r7v4i2.xlsx?download=1";
        // String filePathTwo = "http://192.168.1.118:9091/group1/2022/11/02/20221102124501r7v4i2.xlsx";
        // 截取文件名称
        String filePathTwo = StringUtils.substringBefore(filePath, "?");
        String oneString = StringUtils.substringAfterLast(filePath, "/");
        String twoString = StringUtils.substringBefore(oneString, "?");
        String path = qrcodeLocalPathXlsl + twoString;
        // 文件保存到本地
        try{
            DownLoadFileUtils.downLoadByUrl(filePathTwo,qrcodeLocalPathXlsl);
        }catch (Exception e) {
            e.printStackTrace();
        }
        // String path = "C:\\Users\\23026\\Desktop\\erp1.xlsx";
        ExcelReader build = EasyExcel.read(path, ProductEasyExcelAdd.class, new EasyExcelListener()).build();
        ReadSheet buildOne = EasyExcel.readSheet(0).build();
        build.read(buildOne);
        return ResponseVo.ok();
    }


    /**
     * 批量修改商品（单商品）/（组合商品）
     * 从Excel表格读取数据
     * @param filePath 阿里云文件存储地址
     * @return
     */
    @GetMapping("/updateProductExcel")
    public ResponseVo<String> updateProductExcel(@RequestParam String filePath) {
        String filePathTwo = StringUtils.substringBefore(filePath, "?");
        String oneString = StringUtils.substringAfterLast(filePath, "/");
        String twoString = StringUtils.substringBefore(oneString, "?");
        String path = qrcodeLocalPathXlsl + twoString;
        // 文件保存到本地
        try{
            DownLoadFileUtils.downLoadByUrl(filePathTwo,qrcodeLocalPathXlsl);
        }catch (Exception e) {
            e.printStackTrace();
        }
        // 批量修改 String path = "C:\\Users\\23026\\Desktop\\erp1.xlsx"
        ExcelReader build = EasyExcel.read(path,ProductEasyExcelUpdate.class, new EasyExcelListener()).build();
        ReadSheet buildOne = EasyExcel.readSheet(0).build();
        build.read(buildOne);
        return ResponseVo.ok();
    }

    /**
     * 批量导出（单商品）
     * @param body 查询条件
     * {detailsType 0 默认 1 库存sku 2 店铺sku 3 中文名称 4 英文名称 5 供应商,
     *  matching  0 默认 1 精确匹配 2 模糊匹配,
     *  message 查询内容,
     *  sku状态 0 全部 1 正常销售，2 停止销售，3 清仓,
     *  categoryId 类目id 0 全部 }
     *             @RequestParam String fileName
     * @return
     */
    @PostMapping("/batchDeriveExcel")
    public ResponseVo<Map<String,String>> batchDeriveExcel(@RequestBody String body) {
        // 导出的excel文件本地存储地址
        long l = System.currentTimeMillis();
        String fileName = qrcodeLocalPathXlsl + l + ".xlsx";
        // String fileName = "C:\\Users\\23026\\Desktop\\" + "erp" + l + ".xlsx";
        String nameTwo = String.format("%s.xlsx",l); // 文件名称带后缀
        EasyExcel.write(fileName, ProductEasyExcelAdd.class)
                .sheet("模板")
                .doWrite(() -> {return this.productService.batchDeriveExcel(body);});
        // 【上传到文件服务器】
        String postPNG = OkHttpUtil.postPNG(defaultFileServer, fileName, nameTwo);
        // 解析返回结果，得到上传成功的远程文件路径 http://...
        PNGUploadRespVo pdfUploadResp = JSONObject.parseObject(postPNG, PNGUploadRespVo.class);
        // log.info("{}筛选导出文件链接地址url",pdfUploadResp.getData());
        Map<String,String> map = new HashMap<>();
        map.put("desc","筛选导出文件链接地址");
        map.put("url",pdfUploadResp.getData());
        return ResponseVo.ok(map);
    }

    /**
     * 批量导出选择的商品（单商品）
     * @param list
     * @return
     */
    @PostMapping("/batchDeriveExcelChooses")
    public ResponseVo<Map<String,String>> batchDeriveExcelChooses(@RequestBody List<Integer> list) {
        if (list == null || list.size() == CheckoutUtil.TYPE_ZERO) {
            throw new BizException(ErrorEnum.ErrorCode.BadReqArgument);
        }
        // 导出的excel文件本地存储地址
        long l = System.currentTimeMillis();
        String fileName = qrcodeLocalPathXlsl + l + ".xlsx";
        String nameTwo = String.format("%s.xlsx",l); // 文件名称带后缀
        EasyExcel.write(fileName, ProductEasyExcelAdd.class)
                .sheet("模板")
                .doWrite(() -> {return this.productService.batchDeriveExcelChooses(list);});
        // 【上传到文件服务器】
        String postPNG = OkHttpUtil.postPNG(defaultFileServer, fileName, nameTwo);
        // 解析返回结果，得到上传成功的远程文件路径 http://...
        PNGUploadRespVo pdfUploadResp = JSONObject.parseObject(postPNG, PNGUploadRespVo.class);
        Map<String,String> map = new HashMap<>();
        map.put("desc","选择导出文件链接地址");
        map.put("url",pdfUploadResp.getData());
        return ResponseVo.ok(map);
    }

    //------------------------------------------------》生成条码《------------------------------------------------//
    /**
     * 生成条码和pdf文件
     * @param list 生成条码的商品sku 集合
     * @return 返回pdf文件阿里云链接访问地址
     */
    @PostMapping("/barCodeProduct")
    public ResponseVo<String> barCodeProduct(@RequestBody List<String> list) throws Exception {
        if (list.size() <= CheckoutUtil.TYPE_ZERO) {
            return ResponseUtils.failUtil(ErrorEnum.ErrorCode.BadReqArgument);
        }
        return ResponseVo.ok(this.productService.barCodeProduct(list,qrcodeLocalPathPng,qrcodeLocalPathPdf,fileServer));
    }

    //--》 批量修改商品状态
    /**
     * 批量修改商品状态
     * @param list 商品sku集合
     * @param state 1 正常销售 2 停止销售 3 清仓
     * @return
     */
    @PostMapping("/updateProductStateBySku")
    public ResponseVo<String> updateProductStateBySku(@RequestParam List<String> list,@RequestParam Integer state){
        if (list.size() <= CheckoutUtil.TYPE_ZERO) {
            return ResponseUtils.failUtil(ErrorEnum.ErrorCode.BadReqArgument);
        }
        return ResponseVo.ok(this.productService.updateProductStateBySku(list,state));
    }

    //------------------------------------------------》组合商品《------------------------------------------------//
    /**
     * 商品新增（组合商品）
     * @param product
     * @return
     */
    @PostMapping("/saveOneGroup")
    public ResponseVo<Integer> saveOneGroup(@RequestBody Product product){
        if (product == null || product.getProductGroupList().size() == CheckoutUtil.TYPE_ZERO) {
            throw new BizException(ErrorEnum.ErrorCode.BadReqArgument);
        }
        return ResponseVo.ok(this.productService.insertSelectiveAddGroup(product,product.getProductGroupList()));
    }

    /**
     * 组合商品修改
     * @param product
     * @return
     */
    @PostMapping("/updateOneGroup")
    public ResponseVo<Integer> updateOneGroup(@RequestBody Product product){
        if (product == null || CheckoutUtil.isEmptyInteger(product.getId())) {
            throw new BizException(ErrorEnum.ErrorCode.BadReqArgument);
        }
        return ResponseVo.ok(this.productService.updateOne(product));
    }

    /**
     * 获取商品信息（组合商品）
     * @param body 查询条件
     * {detailsType 0 默认 1 库存sku 2 店铺sku 3 中文名称 4 英文名称 5 供应商,
     *  matching  0 默认 1 精确匹配 2 模糊匹配,
     *  message 查询内容,
     *  skuState sku状态 0 全部 1 正常销售，2 停止销售，3 清仓,
     *  categoryId 类目id 0 全部
     *  page 页索引
     *  limit 页大小}
     * @return
     */
    @PostMapping("/getListGroup")
    public ResponseVo<PageListVo<Product>> getListGroup(@RequestBody String body) {
        Integer page = JacksonUtil.parseInteger(body, "page");
        Integer limit = JacksonUtil.parseInteger(body, "limit");
        return ResponseVo.okList(this.productService.selectLinkListGroup(body,page,limit));
    }

    /**
     * 查询商品信息 组合商品新增时使用（组合商品）
     * @param body 查询条件
     * {detailsType 1 库存sku  3 中文名称 4 英文名称,
     *  matching   1 精确匹配 2 模糊匹配,
     *  message 查询内容,}
     * @return
     */
    @PostMapping("/getListGroupBySku")
    public ResponseVo<List<Product>> getListGroupBySku(@RequestBody String body) {
        return ResponseVo.ok(this.productService.getListGroupBySku(body));
    }

    /**
     * 获取商品信息（组合商品）
     * @param id 商品id
     * @return
     */
    @GetMapping("/getOneGroup")
    public ResponseVo<Product> getOneGroup(@RequestParam Integer id){
        if (CheckoutUtil.isEmptyInteger(id)) {
            throw new BizException(ErrorEnum.ErrorCode.BadReqArgument);
        }
        return ResponseVo.ok(this.productService.selectOneGroup(id));
    }

    /**
     * 批量添加组合商品（组合商品）
     * 从Excel表格读取数据
     * @param filePath 阿里云文件存储地址
     * @return
     */
    @GetMapping("/addProductExcelGroup")
    public ResponseVo<String> addProductExcelGroup(@RequestParam String filePath) {
        // 截取文件名称
        String filePathTwo = StringUtils.substringBefore(filePath, "?");
        String oneString = StringUtils.substringAfterLast(filePath, "/");
        String twoString = StringUtils.substringBefore(oneString, "?");
        String path = qrcodeLocalPathXlsl + twoString;
        // 文件保存到本地
        try{
            DownLoadFileUtils.downLoadByUrl(filePathTwo,qrcodeLocalPathXlsl);
        }catch (Exception e) {
            e.printStackTrace();
        }
        // String path = "C:\\Users\\23026\\Desktop\\erpGroup.xlsx";
        ExcelReader build = EasyExcel.read(path, ProductEasyExcelGroupAdd.class, new EasyExcelListener()).build();
        ReadSheet buildOne = EasyExcel.readSheet(0).build();
        build.read(buildOne);
        return ResponseVo.ok();
    }


    /**
     * 批量导出（组合商品）
     * @param body 查询条件
     * { matching  0 默认 1 精确匹配 2 模糊匹配,
     *  detailsType 0 默认 1 库存sku  3 中文名称 4 英文名称 ,
     *  message 查询内容,
     *  sku状态 0 全部 1 正常销售，2 停止销售，3 清仓}
     * @return
     */
    @PostMapping("/batchDeriveExcelGroup")
    public ResponseVo<Map<String,String>> batchDeriveExcelGroup(@RequestBody String body) {
        // 导出的excel文件本地存储地址
        long l = System.currentTimeMillis();
        String fileName = qrcodeLocalPathXlsl + l + ".xlsx";
        // String fileName = "C:\\Users\\23026\\Desktop\\" + "erp" + l + ".xlsx";
        String nameTwo = String.format("%s.xlsx",l); // 文件名称带后缀
        EasyExcel.write(fileName, ProductEasyExcelGroupAdd.class)
                .sheet("模板")
                .doWrite(() -> {return this.productService.batchDeriveExcelGroup(body);});
        // 【上传到文件服务器】
        String postPNG = OkHttpUtil.postPNG(defaultFileServer, fileName, nameTwo);
        // 解析返回结果，得到上传成功的远程文件路径 http://...
        PNGUploadRespVo pdfUploadResp = JSONObject.parseObject(postPNG, PNGUploadRespVo.class);
        // log.info("{}筛选导出文件链接地址url",pdfUploadResp.getData());
        Map<String,String> map = new HashMap<>();
        map.put("desc","筛选导出文件链接地址");
        map.put("url",pdfUploadResp.getData());
        return ResponseVo.ok(map);
    }

    /**
     * 批量导出选择的商品（组合商品）
     * @param list
     * @return
     */
    @PostMapping("/batchDeriveExcelGroupById")
    public ResponseVo<Map<String,String>> batchDeriveExcelGroupById(@RequestBody List<Integer> list) {
        // 导出的excel文件本地存储地址
        long l = System.currentTimeMillis();
        String fileName = qrcodeLocalPathXlsl + l + ".xlsx";
        // String fileName = "C:\\Users\\23026\\Desktop\\" + "erp" + l + ".xlsx";
        String nameTwo = String.format("%s.xlsx",l); // 文件名称带后缀
        EasyExcel.write(fileName, ProductEasyExcelGroupAdd.class)
                .sheet("模板")
                .doWrite(() -> {return this.productService.batchDeriveExcelChoosesGroup(list);});
        // 【上传到文件服务器】
        String postPNG = OkHttpUtil.postPNG(defaultFileServer, fileName, nameTwo);
        // 解析返回结果，得到上传成功的远程文件路径 http://...
        PNGUploadRespVo pdfUploadResp = JSONObject.parseObject(postPNG, PNGUploadRespVo.class);
        // log.info("{}筛选导出文件链接地址url",pdfUploadResp.getData());
        Map<String,String> map = new HashMap<>();
        map.put("desc","筛选导出文件链接地址");
        map.put("url",pdfUploadResp.getData());
        return ResponseVo.ok(map);
    }

}
